Решение нелинейных уравнений
Численное решение нелинейных уравнений
Метод деления отрезка пополам
Метод деления отрезка пополам (метод половинного деления, метод бисекции) – один из простейших методов решения нелинейных уравнений.
Пусть мы нашли отрезок , на котором расположено искомое значение корня . В качестве начального приближения корня примем середину этого отрезка:
Исследуем значения функции на концах отрезков и . Тот отрезок, на концах которого функция принимает значения разных знаков, содержит искомый корень. Поэтому его принимаем в качестве нового отрезка локализации корня. В качестве первой итерации корня принимаем середину этого нового отрезка и т.д. Таким образом, после каждой итерации отрезок, на котором расположен корень, уменьшается вдвое и после итераций он сокращается в раз.
Итерационный процесс продолжается до тех пор, пока значение функции после -й итерации не станет меньшим по модулю некоторого заданного малого числа , т.е.
В качестве другого критерия можно использовать длину получаемых отрезков: счет прекращается, если она становится меньше допустимой погрешности, т.е.
Достоинства метода:
- простота,
- надежность,
- устойчивость к ошибкам округления,
- метод сходится к корню для любых непрерывных функций.
Основной недостаток:
- метод медленно сходится, т.е. необходимо использовать большое число итераций для достижения заданной точности.
Пример. Решим в Engee уравнение
методом деления отрезка пополам с точностью .
Сначала зададим функцию , представляющую собой левую часть уравнения, и построим ее график.
using Plots;
Fun = x -> exp.(x) .+ 2*x .- 5;
x = -2:0.01:2;
plot(x, Fun(x))
Из графика видно, что корень уравнения (абсцисса точки пересечения графика с осью Ox) находится на отрезке . Зададим концы отрезка локализации корня: , , а также точность :
a = -2;
b = 2;
eps = 10^(-6);
Теперь найдем приближенное значение корня методом деления отрезка пополам.
c = (a+b) / 2;
while abs(a-b) > eps
c = (a+b) / 2;
if Fun(a) * Fun(c) < 0
b = c;
else
a = c;
end
end
display(c)
✏️Задание 1
Решите в Engee уравнение
методом деления отрезка пополам с точностью .
Решение
using Plots;
Fun = x -> x.^3 .+ 3*x .+ 2;
x = -2:0.01:2;
plot(x, Fun(x))
Из графика видно, что корень уравнения находится на отрезке .
a = -2;
b = 0;
eps = 10^(-7);
c = (a+b) / 2;
while abs(a-b) > eps
c = (a+b) / 2;
if Fun(a) * Fun(c) < 0
b = c;
else
a = c;
end
end
display(c)
Метод Ньютона
Метод Ньютона (метод касательных) – один из наиболее эффективных методов решения нелинейных уравнений.
Будем считать, что первая и вторая производные функции сохраняют знак на отрезке , на котором находится корень уравнения. Это означает, что функция монотонна и не имеет точек перегиба.
Пусть начальное приближение корня – правый конец отрезка , т.е. . Проведем касательную к кривой в точке .
Уравнение касательной имеет вид:
Отсюда найдем первое приближение корня как точку пересечения касательной с осью абсцисс ():
Аналогично для точки найдем точку пересечения ее касательной с осью абсцисс:
Последующие приближения к корню находят по формуле:
Если начать проводить касательные в точке , то первое приближение будет удаляться от корня. Чтобы обеспечить сходимость приближений к корню, нужно правильно выбрать конец отрезка, в котором проводится касательная. Касательную нужно проводить в том конце отрезка , где знак функции совпадает со знаком ее второй производной, т.е. .
Для окончания итерационного процесса можно использовать условие
или условие близости двух последовательных приближений:
Достоинства метода:
- высокая скорость сходимости,
- простота,
- устойчивость к погрешностям счета,
- метод применим для обширного класса нелинейных уравнений.
Основной недостаток метода:
- Метод Ньютона обладает только локальной сходимостью. Это означает, что для гарантии сходимости необходимо выбирать хорошее начальное приближение, попадающее в малую окрестность корня.
Пример. Решим в Engee уравнение из предыдущего примера
методом Ньютона с точностью .
Как обычно, сначала зададим функцию , представляющую собой левую часть уравнения, и построим ее график.
using Plots;
Fun = x -> exp.(x) .+ 2*x .- 5;
x = -2:0.01:2;
plot(x, Fun(x))
В качестве начального приближения к корню можно выбрать точку . Для нее выполняется условие , т.к. в этой точке и функция , и ее вторая производная положительные (график функции лежит выше оси Ox и является вогнутым). Зададим точность , начальное приближение , начальное значение текущей итерации корня и производную от функции : .
eps = 10^(-6);
x = 1.2;
x1 = x + 2*eps;
dFun = x -> exp(x) + 2;
Теперь найдем приближенное значение корня методом Ньютона.
while abs(x1-x) > eps
x = x1;
x1 = x - Fun(x) / dFun(x);
end
display(x1)
Видно, что с точностью до приближенные значения корня, полученные методом деления отрезка пополам и методом Ньютона, совпадают.
✏️Задание 2
Решите в Engee уравнение из Задания 1
методом Ньютона с точностью .
Решение
using Plots;
Fun = x -> x.^3 .+ 3*x .+ 2;
x = -2:0.01:2;
plot(x, Fun(x))
Из графика видно, что в качестве начального приближения корня можно взять точку .
eps = 10^(-7);
x = -1;
x1 = x + 2*eps;
dFun = x -> 3*x^2 + 3;
while abs(x1-x) > eps
x = x1;
x1 = x - Fun(x) / dFun(x);
end
display(x1)
Метод простых итераций
Метод простых итераций состоит в том, что исходное нелинейное уравнение заменяется эквивалентным ему уравнением
Для этого можно прибавить к левой и правой частям уравнения. Пусть известно начальное приближение корня . Подставляя это значение в правую часть преобразованного уравнения, получаем новое приближение:
Подставляя каждый раз новое приближение корня в правую часть уравнения, получаем последовательность значений
Итерационный процесс прекращается, если результаты двух последовательных итераций близки:
Достаточным условием сходимости метода простых итераций является условие
Пример. Решим в Engee уравнение
методом простых итераций с точностью .
Уравнение имеет вид , пригодный для использования этого метода. Достаточное условие сходимости метода выполняется, т.к. во всех точках, кроме точек .
Зададим функцию и построим график функции .
Fun = x -> cos.(x);
x = 0:0.01:2;
plot(x, Fun(x)-x)
В качестве начального приближения можно взять любую точку, близкую к точке пересечения графика с осью Ox. Возьмем . Зададим точность , начальное приближение и начальное значение текущей итерации корня.
eps = 10^(-6);
x = 0.5;
x1 = x + 2*eps;
Теперь найдем приближенное значение корня методом простых итераций.
while abs(x1-x) > eps
x = x1;
x1 = Fun(x);
end
display(x1);
✏️Задание 3
Решите в Engee уравнение
методом простых итераций с точностью .
Подсказка
Сначала нужно преобразовать уравнение к виду :
Решение
Fun = x -> exp.(-x);
x = 0:0.01:2;
plot(x, Fun(x)-x)
Из графика видно, что в качестве начального приближения можно взять точку . Проверим достаточное условие сходимости метода простых итераций на рассматриваемом отрезке: .
eps = 10^(-6);
x = 0.5;
x1 = x + 2*eps;
while abs(x1-x) > eps
x = x1;
x1 = Fun(x);
end
display(x1);